package com.whz.streamdemo;

import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

/**
 * @Author: sinosoft
 * @Description: 从词典文件中读取单词,并打印出单词长度符合用户指定的最低值的所有换位词
 * 包含相同的字母,但是字母顺序不同的两个词,称为换位词
 * @Date: Create in 20:56 2021/5/17
 * @Modified By:
 */
@Slf4j
public class Anagrams {
    public static void main(String[] args) throws IOException {
        Path dictionary = Paths.get("D:\\IDEACode\\And-then-there-were-none.txt");
        int minGroupSize = Integer.parseInt("20");
        Map<String, Set<String>> groups = Maps.newHashMap();
        try (Scanner s = new Scanner(dictionary)) {
            while (s.hasNext()) {
                String word = s.next();
                // computeIfAbsent 在映射中查找一个键
                // 如果这个键存在,该方法指挥返回与之关联的值
                // 如果键不存在,该方法就会对该键运用指定的函数对象计算出一个值,将这个值与键关联起来,并返回计算得到的值
                groups.computeIfAbsent(alphabetize(word),
                        (unused) -> Sets.newTreeSet()).add(word);
            }

        }
        for (Set<String> value : groups.values()) {
            log.info("ValueSize: {}", value.size());
        }
    }
    private static String alphabetize(String s) {
        char[] a = s.toCharArray();
        Arrays.sort(a);
        return new String(a);
    }
}
